home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
CC_C
/
0574.ZIP
/
TPC.DOC
< prev
next >
Wrap
Text File
|
1986-12-31
|
7KB
|
260 lines
TPC - Translate Pascal to C.
(C) Copyright 1986 by Samuel H. Smith; All rights reserved.
Please refer all inquiries to:
S.H.Smith
5119 N 11 Ave 332
Phoenix, AZ 85013
You may copy and distribute this program freely, provided that:
1) No fee is charged for such copying and distribution, and
2) It is distributed ONLY in its original, unmodified state.
If you like this program, and find it of use, then your contribution
will be appreciated. If you are using this product in a commercial
environment, then the contribution is not voluntary.
Usage: TPC d:path\filename[.ext] [>outfile]
d: drive and path are optional
ext defaults to .PAS
Example:
TPC program.pas >program.c
This program will read a turbo pascal source file and convert it into
the corresponding C source code. It does about 90% of the work
required to do the translation.
The following language constructs are translated:
------------------------------------------------
Comments are translated from either {...} or (*...*) into /*...*/.
Begin and End are translated into { and }.
Const declarations are translated from
ID = VALUE
into
static ID = VALUE.
Simple Var declarations are translated from
ID TYPE
into
TYPE ID.
The following simple types are translated
from BOOLEAN to char,
INTEGER to int,
REAL to double.
Record types are translated from
ID = record MEMBER-LIST end
into
typedef struct { MEMBER-LIST } ID.
Enumeration types are translated from
ID = (...)
into
typedef enum {...} ID.
Array types are translated from
ID = array [RANGE] of TYPE
into
typedef TYPE ID[RANGE].
Pointer types are translated from
ID = ^DEFINED-TYPE
into
DEFINED-TYPE *ID.
String types are translated from
ID = string[N]
into
typedef char ID[N].
File types are translated from
ID = text[N]
ID = text
into
FILE *ID
int ID.
For statements are translated from
for VAR := FIRST to LAST do STATEMENT
for VAR := FIRST downto LAST do statement
into
for (VAR = FIRST; VAR <= LAST; VAR++) STATEMENT
for (VAR = FIRST; VAR >= LAST; VAR--) STATEMENT
While statements are translated from
while COND do STATEMENT
into
while (COND) statement.
Repeat statements are translated from
repeat STATEMENTS until COND
into
do { STATEMENTS } while(!COND).
If statements are translated from
if COND then STATEMENT else STATEMENT
into
if (COND) STATEMENT; else STATEMENT.
Case statements are translated from
case VALUE of
V: STATEMENT;
V,U: STATEMENT;
else STATEMENT
end
into
switch (VALUE) {
case V: STATEMENT; break;
case V:
case U: STATEMENT; break;
default: STATEMENT;
}.
The IN operator is translated from
VAL in [A,B,C]
into
inset(VAL, setof(A,B,C,-1)).
The ParamCount and ParamStr functions are translated from
paramcount
paramstr(n)
into
arcv
argv[n].
Dummy parameter lists are added to function and procedure calls,
where they are required in C but not in Pascal.
The following expression operators are translated
from DIV to /, MOD to %,
AND to &&, OR to ||,
XOR to ~, <> to !=,
NOT to ! , SHR to >>,
SHL to <<, = to ==,
:= to =.
The '^' symbol is translated
from VAR^ to *VAR,
VAR^.MEMBER to VAR->MEMBER.
Exit statements are translated
from exit to return.
The New operator is translated from
new(VAR)
into
VAR = malloc(sizeof(*VAR)).
The special value, nil, is translated into NULL.
Procedure/function formal parameter lists are translated into a
separate procedure declaration and parameter variable
declarations, as required by C, e.g.
from
function NAME(V1: TYPE1; V2: TYPE2): TYPE3
into
TYPE3 NAME(V1,V2)
TYPE1 V1;
TYPE2 V2;
Procedures are translated into functions with 'void' return types.
The special character literal syntax, ^C or #nn, is translated into
'\ooo', where ooo is the octal notation for the ascii code.
Hex constants $hhhh are translated into 0xhhhh.
Write and WriteLn are translated from:
write(VAR,VAR:n,VAR:n:m)
writeln(FILE,VAR,VAR,VAR)
into
printf("%d%nd%n.md",VAR,VAR,VAR)
fprintf(FILE,"%d%d%d\n",VAR,VAR,VAR).
Read and ReadLn are translated from:
read(VAR,VAR,VAR)
readln(FILE,VAR,VAR,VAR)
into
scanf("%d%nd%d",&VAR,&VAR,&VAR)
fscanf(FILE,"%d%d%d\n",&VAR,&VAR,&VAR).
String assignments are translated from:
VAR := "string"
VAR := VAR1 + "string"
into
strcpy(VAR, "string")
strcpy(VAR, concat(VAR1, "string")).
String comparisons are translated from:
VAR == "string"
VAR < "string"
"string" >= VAR
into
(strcmp(VAR,"string") == 0)
(strcmp(VAR,"string") < 0)
(strcmp("string",VAR) >= 0).
Function value assignments are translated from:
FUN_NAME := expr
into
return expr.
Compiler directives are translated
from {$B+/-} to #pragma standard_io(ON/OFF),
{$C+/-} #pragma control_c_check(ON/OFF),
{$D+/-} #pragma device_check(ON/OFF),
{$Fn} #pragma max_files(n),
{$Gn} #pragma input_file_buffer(n),
{$I name} #include "name",
{$I+/-} #pragma io_error_check(ON/OFF),
{$K+/-} #pragma stack_check(ON/OFF),
{$Pn} #pragma output_file_buffer(n),
{$R+/-} #pragma range_check(ON/OFF),
{$U+/-} #pragma user_interrupt(ON/OFF),
{$V+/-} #pragma param_type_check(ON/OFF).
Some language features that are not translated:
-----------------------------------------------
Nested procedures or function cannot be coded in C.
VAR parameters must be manually recoded.
File access procedures need to be coded (reset, assign, close, etc.).
Ranges in the form VAL..VAL are not translated in case statements.
Forward pointer type declarations are translated, but will not
compile in C. They must be manually recoded.
Variant record types should be translated into unions, but aren't.
Bitwise AND and OR operators are always translated into the logical
operators && and ||.
C operator precidence differs from that of Pascal, and the
differences are not translated.
The With statement is not translated.
The MEM[] and PORT[] arrays are not translated. These should be
turned int function calls.
Absolute variables are not (and probably cannot be) translated.